//
// Created by jsjxsy on 2022/6/30.
//
#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
  printf("second\n");         // 打印
  longjmp(buf, 1);             // 跳回setjmp的调用处 - 使得setjmp返回值为1
}

void first(void) {
  second();
  printf("first\n");          // 不可能执行到此行
}

int main(void) {
  if (!setjmp(buf)) {
    first();                // 进入此行前，setjmp返回0
  } else {                    // 当longjmp跳转回，setjmp返回1，因此进入此行
    printf("main\n");       // 打印
  }

  int i;
  printf("%d\n",i = setjmp(buf));//第一次输出0，第二次输出longjmp的第二个参数。
  if (i==0)
    longjmp(buf,3);//可自行修改第二参数查看不同结果。
  return 0;
}